package thread;
/*
  多线程并发安全问题
  当多个线程并发操作宁一临界资源  由于线程切换实际不确定 导致操作顺序出现混乱、
  临界资源：操作资源完成步骤的同一时刻只能由单一线程进行的资源
 */
public class SyncDemo1 {
    public static void main(String[] args) {
        Table ti = new Table();
        Thread zs = new Thread(){
          public void run(){
              while (true){
                  int bean = ti.getBeans();
                  Thread.yield();
                  System.out.println(getName()+":"+bean);
              }
          }
        };
        Thread ls = new Thread(){
          public void run(){
              while (true){
                  int bean = ti.getBeans();
                  Thread.yield();
                  System.out.println(getName()+":"+bean);
              }
          }
        };
        zs.start();
        ls.start();
   }
}
class Table{
    private  int beans = 20;
    /*
     在一个方法使用 synchronized修饰后 该方法称为同步方法 多个线程不能同时
     在方法内部执行  将多个线程并发抢的操作改为排队
     */
    //       上个锁 在一个调用没执行完时另一个不能用
     public synchronized int getBeans(){
         if (beans==0){
             throw new RuntimeException("没有豆豆了");
         }
         Thread.yield();
         return beans--;
     }
}